import axios, {AxiosResponse, AxiosError, InternalAxiosRequestConfig} from 'axios';
import { ElMessage } from 'element-plus';
import router from "../router";

const request = axios.create({
    baseURL: 'http://127.0.0.1:8080',
    timeout: 5000
});

export interface ApiResponse<T = any> {
    code: number;
    data: T;
    msg: string;
}

// 请求拦截器
request.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        console.log('发送请求:', {
            url: config.url,
            method: config.method,
            data: config.data,
            headers: config.headers
        });
        const token = localStorage.getItem('token');
        if (token) {
            console.log('添加token到请求头:', token);
            config.headers = config.headers || {};
            config.headers['Authorization'] = `${token}`;
        }
        return config;
    },
    (error: AxiosError) => {
        console.error('请求拦截器错误:', error);
        return Promise.reject(error);
    }
);

// 响应拦截器
request.interceptors.response.use(
    async (response: AxiosResponse<ApiResponse>) => {
        console.log('收到响应:', response.data);
        const res = response.data;

        // 统一处理 401
        if (res.code === 401) {
           await handleUnauthorized();
            return Promise.reject(res);
        }

        if (res.code !== 200) {
            console.error('响应错误:', res.msg);
            ElMessage.error(res.msg || '请求失败');
            return Promise.reject(res);
        }

        // 直接返回 data 字段，简化调用方代码
        return res.data;
    },
    async (error: AxiosError<ApiResponse>) => {
        console.error('响应拦截器错误:', error);

        // 网络错误或无响应
        if (!error.response) {
            ElMessage.error('网络错误，请检查网络连接');
            return Promise.reject({
                code: 500,
                msg: '网络错误，请检查网络连接',
                data: null
            });
        }

        // 后端返回的错误（如 401、500 等）
        const res = error.response.data;

        // 统一处理 401
        if (res?.code === 401) {
          await  handleUnauthorized();
          return Promise.reject(res);
        } else {
            ElMessage.error(res?.msg || '请求失败');
        }

        return Promise.reject(res || {
            code: error.response.status,
            msg: '请求失败',
            data: null
        });
    }
);

// 统一处理 401 未授权
async function handleUnauthorized() {
    localStorage.removeItem('token');
    await router.push('/login');
    ElMessage.error('登录已过期，请重新登录');
}

export default request;